

//  #include "pb_kt_ota_device.h"


#ifndef pb_kt_ota_device_h
#define pb_kt_ota_device_h



//#include "shell_cmd.h"
#include <stdint.h>

#include "pb.h"
#include "socket_struct.h"


typedef struct {
	unsigned int hi4;
	unsigned short low2;
	unsigned short rsv;
}mac_st_t;


typedef union {
	uint64_t num64;
	unsigned char oct[8];
	mac_st_t mac_st;
	unsigned int arr32[2];
	unsigned short arr16[4];
}un_u64_t, un64_t;


typedef struct {
	send_cb_t func;
	sock_proc_param_t udp_param;
}udp_socket_cb_t;




typedef int (*kt_progress_cb)(unsigned int total_bytes, unsigned int getton_bytes, int stage);
typedef int (*ota_error_rpt_cb)(int err_code, int stage);



//7.5.3.2设备主动上报OTA升级进度 C7H
// 0： 执行成功；
// 非0：执行失败的错误码

typedef enum {
	OTA_ERR_CODE_SUCCESSED  = 0,    // 0： 执行成功；success
	OTA_ERR_CODE_FAILED ,           // 非0：执行失败的错误码
} OTA_C7_err_code_e ;




// 升级阶段  stage	
// 1： 集中器从平台下载文件
// 2： 集中器文件校验
// 3： 集中器烧写Flash
// 4： 集中器传输文件给子设备
// 5： 子设备文件校验
// 6： 子设备烧写Flash

//OTA_STEP
typedef enum {
	OTA_STAGE_GW_DOWNLOAD = 1, // 1： 集中器从平台下载文件
	OTA_STAGE_GW_CHK = 2,      // 2： 集中器文件校验
	OTA_STAGE_GW_SAVE,         // 3： 集中器烧写Flash
	OTA_STAGE_TRANSMIT_NODE,
	OTA_STAGE_NODE_CHK,
	OTA_STAGE_DEVICE_BURN,   // 6： 子设备烧写Flash

	OTA_STAGE_GW2CCO,        // 固件从网关传到cco ： 缓存sta固件
	OTA_STAGE_CCO2STA,       // 固件从cco传到sta ： 烧录sta固件
	
	OTA_STAGE_FINISH,

} OTA_C7_stage_code_e;






typedef struct {
	char url[256];
	char fw_ver[16];
	unsigned int fw_size;
	unsigned short fw_crc;  //????crc32?? crc16??
	//uint32_t fw_crc;  //????crc32?? crc16??

	char fw_type;  // 1:host, 2:node mcu, 4: plc-cco, 4,plc-sta
	unsigned char per;  //  进度条	
	unsigned short node_type; //fw_type为2时有效：节点设备类型 sh_type
	char real_name[64];
	                 
	un_u64_t un_mac;
	kt_progress_cb kt_download_cb;			
	char file_name[128];
}ota_param_t;


#if 0

int pb_cmd_ota_read_flash_size(const void *pdata, int inlen, const udp_socket_cb_t *param);
int ota_cmd_download_start(const void *data, int len, const udp_socket_cb_t *param);

int unpack_pkg_CMD_SET_DEVICE_OTAFW_PKG_START(const void *pdata, int len, const udp_socket_cb_t *param);

int unpack_pkg_CMD_SEND_DEVICE_OTAFW_PKG(const void *data, int len, const udp_socket_cb_t *param);
int unpack_pkg_CMD_SET_DEVICE_OTAFW_PKG_END(const void *data, int len, const udp_socket_cb_t *param);
int unpack_pkg_CMD_QUERY_DEVICE_FW_CHK(const void *data, int len, const udp_socket_cb_t *param);
int unpack_pkg_CMD_SET_DEVICE_AUTO_UPGRADE(const void *data, int len, const udp_socket_cb_t *param);
int pb_cmd_ota_download_ready(const void *data, int len, const udp_socket_cb_t *param);
int unpack_ota_progress_rsp(const void *data, int len, const udp_socket_cb_t *param);

#endif

/*
functin: ota_progress_pro() 上报ota进度， 可用于网关http下载进度和网关传送给子设备进度
param: total, 总帧数数
       gotten, 已处理帧数
**/
//int ota_progress_pro(unsigned int total, unsigned int gotten);

uint16_t pb_ota_http_start(pb_istream_t* istream, uint8_t* txbuf,uint8_t seq);

/////升级进度回调函数
int download_progress_callback(unsigned int total, unsigned int gotten, int stage);

int ota_error_report(int err_code, int stage, unsigned char per);  ///ota_manager.c调用


#endif

